/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Application;
import Application.Elements.Element;
import java.util.*;

/**
 * Fo halozat osztaly, gyakorlatilag ez a modell, egy kontener a halozati elemeknek.
 * @author Stikmann
 */
public class Network implements CheckResetSimulate{


    /**
     * Az osszes vezerelt kaput tartalmazo kollekcio.
     */
    public List<CheckResetSimulate> collection;
    
    /**
     * A hálózat osztály konstruktora
     */
    public Network(){
        collection=new ArrayList<CheckResetSimulate>();
    }


    @Override
    public String toString() {
        // Szep outputot szeretnenk a skeletonhelperben.
        return this.getClass().getSimpleName()+"@"+Integer.toHexString(this.hashCode());
    }

    /**
     * Elvegzi a tarolt elemek szimulaciojat.
     * @exception UnstableException ha a hálózat nem stabil
     * @return Ha változott bármi is, true, ha nem, false
     */
    public boolean simulate() throws UnstableException{
        // Ez a ciklus addig fusson amig van valtozas a halozat allapotaban,
        // vagy tul sokszor le nem fut.
        int runs=0;
        int maxruns=collection.size()*collection.size()+5;
        boolean valtozott;
        do{
            valtozott=false;
            for (CheckResetSimulate elem:collection)
            {

                boolean valt=elem.simulate();
                if(valt)
                    valtozott=true;
            }
            ++runs;
        } while (valtozott && runs<maxruns);

        if (runs>=maxruns)
            throw new UnstableException();
        
        // Ha a fenti csodaciklus pontosan egyszer futott le, false,
        // egyébként true
        return runs!=1;
    }

    /**
     * Alaphelyzetbe allitja az osszes tarolt kaput.
     */
    public void reset(){
        for (CheckResetSimulate elem:collection)
                elem.reset();
    }

    /**
     * Leellenorzi, hogy van-e hiba a halozatban
     * @return Ha nincs hiba, null, egyebkent a hibauzenet.
     */
    public String check(){
        String hiba=null;
        for (CheckResetSimulate elem:collection)
        {
             hiba=elem.check();
             if (hiba!=null)
             {
                 hiba="Hiba a "+elem +" elemnel: "+hiba;
                break;
             }
        }
        return hiba;
    }

    /**
     * Hozzaad egy kaput vagy alhálózatot a halozathoz
     * @param mit Az objektum amit hozzaadunk
     */
    public void addGate(CheckResetSimulate mit)
    {
        collection.add(mit);
    }

    /**
     * osszekot ket kaput a halozatban
     * @param src A forras elem, aminek a kimenetet kotjuk
     * @param dst A cel elem, aminek a bemenetere kotunk
     */
    public void connectGate(Element src, Element dst)
    {
        dst.connectTo(src);
    }
}